package br.iesb.bean;

import java.util.ArrayList;
import java.util.List;

import br.iesb.bean.boat.ETipoEmbarcacao;
import br.iesb.bean.boat.ETiro;
import br.iesb.bean.boat.Embarcacao;

public class Tabuleiro {

    /**
     * Porta-viÃµes (tam: 5) - qtd: 1; EncouraÃ§ado (tam: 4) - qtd: 1; Cruzador (tam: 3) - qtd: 2; Destroyer (tam: 2) -
     * qtd: 3; Submarino (tam: 1) - qtd: 4;
     */

    private List<Posicao> posicoes;
    private List<Embarcacao> colEmbarcacao;
    private int qtColunas = 10;
    private int qtLinhas = 10;
    private int qtSubmarino = 4;
    private int qtDestroyer = 3;
    private int qtCruzador = 2;
    private int qtEncouracado = 1;
    private int qtPortaAvioes = 1;

    public Tabuleiro(List<Embarcacao> colEmbarcacao, List<Posicao> colPosicoes,
            int qtColunas, int qtLinhas, int qtSubmarino, int qtDestroyer,
            int qtCruzador, int qtEncouracado, int qtportaAvioes) {
        super();
        this.colEmbarcacao = colEmbarcacao;
        this.posicoes = colPosicoes;
        this.qtColunas = qtColunas;
        this.qtLinhas = qtLinhas;
        this.qtSubmarino = qtSubmarino;
        this.qtDestroyer = qtDestroyer;
        this.qtCruzador = qtCruzador;
        this.qtEncouracado = qtEncouracado;
        this.qtPortaAvioes = qtportaAvioes;
        gerarTabuleiro();
        System.out.println(desenharTabuleiro());
    }

    public Tabuleiro() {
        super();
        gerarTabuleiro();
        carregar();
        System.out.println(desenharTabuleiro());
        System.out.println("\n\nInicializacao do tabuleiro completada!\n\n");

    }

    private void gerarTabuleiro() {
        posicoes = new ArrayList<Posicao>(qtColunas * qtLinhas);
        for (int i = 0; i < qtColunas; i++) {
            for (int j = 0; j < qtLinhas; j++) {
                posicoes.add(new Posicao(i, j, ETiro.WATER));
            }
        }
    }

    private void carregar() {
        colEmbarcacao = new ArrayList<Embarcacao>(qtSubmarino + qtDestroyer + qtCruzador + qtEncouracado
                + qtPortaAvioes);

        for (int i = 0; i < qtPortaAvioes; i++) {
            Embarcacao portaAvioes = new Embarcacao(ETipoEmbarcacao.PORTA_AVIOES);
            posicionarEmbarcacoes(portaAvioes);
            colEmbarcacao.add(portaAvioes);
        }

        for (int i = 0; i < qtEncouracado; i++) {
            Embarcacao encouracado = new Embarcacao(ETipoEmbarcacao.ENCOURACADO);
            posicionarEmbarcacoes(encouracado);
            colEmbarcacao.add(encouracado);
        }

        for (int i = 0; i < qtPortaAvioes; i++) {
            Embarcacao portaAvioes = new Embarcacao(ETipoEmbarcacao.PORTA_AVIOES);
            posicionarEmbarcacoes(portaAvioes);
            colEmbarcacao.add(portaAvioes);
        }

        for (int i = 0; i < qtSubmarino; i++) {
            Embarcacao submarino = new Embarcacao(ETipoEmbarcacao.SUBMARINO);
            posicionarEmbarcacoes(submarino);
            colEmbarcacao.add(submarino);
        }
        for (int i = 0; i < qtDestroyer; i++) {
            Embarcacao destroyer = new Embarcacao(ETipoEmbarcacao.DESTROYER);
            posicionarEmbarcacoes(destroyer);
            colEmbarcacao.add(destroyer);
        }
        for (int i = 0; i < qtCruzador; i++) {
            Embarcacao cruzador = new Embarcacao(ETipoEmbarcacao.CRUZADOR);
            posicionarEmbarcacoes(cruzador);
            colEmbarcacao.add(cruzador);
        }
    }

    public String desenharTabuleiro()
    {
        String strExit = "";
        int count = 0;
        for (Posicao position : this.posicoes) {
            if ((count) % qtColunas == 0)
            {
                strExit += "\n";
            }
            if (position.getEstado().equals(ETiro.WATER)) {
                strExit += " ~ ";
            } else if (position.getEstado().equals(ETiro.HIT)) {
                strExit += " x ";
            } else if (position.getEstado().equals(ETiro.MISS)) {
                strExit += " o ";
            }
            count++;
        }

        return strExit;
    }

    private void posicionarEmbarcacoes(Embarcacao embarcacao) {
        int linha = (int) (Math.random() * qtLinhas);
        int coluna = (int) (Math.random() * qtColunas);

        if (linha > qtLinhas || coluna > qtColunas) {
            posicionarEmbarcacoes(embarcacao);
            return;
        }
        int indice = posicoes.indexOf(new Posicao(linha, coluna));
        if (indice < 0) {
            posicionarEmbarcacoes(embarcacao);
            return;
        }

        Posicao p = posicoes.get(indice);
        if (p.isInOcupada()) {
            System.out.println(String.format("Posicao ocupada L%d C%d", p.getLinha(), p.getColuna()));
            posicionarEmbarcacoes(embarcacao);
            return;
        }
        if ((linha + coluna) % 2 == 0) {
            int l = p.getLinha() + embarcacao.getTamanho();
            if (l < qtLinhas) {
                for (int i = 1; i < embarcacao.getTamanho(); i++) { // comeÃ§a com 1 pq a posiÃ§Ã£o zero Ã© colocada na
                                                                    // variÃ¡vel p
                    int posicao = posicoes.indexOf(new Posicao(linha, coluna + i));
                    if (posicao < 0) {
                        posicionarEmbarcacoes(embarcacao);
                        return;
                    }
                    Posicao pNew = posicoes.get(posicao);
                    if (!pNew.isInOcupada()) {
                        pNew.setInOcupada(true);
                    } else {
                        System.out.println(String.format("Posicao ocupada L%d C%d", pNew.getLinha(), pNew.getColuna()));
                        posicionarEmbarcacoes(embarcacao);
                        return;
                    }
                }
                embarcacao.setPosicaoInicial(p);
                embarcacao.setInHorizontal(true);
                p.setInOcupada(true);
                System.out.println(String.format("Posicao L%d-C%d, ocupada com peca do tipo %s", p.getLinha(),
                        p.getColuna(), embarcacao.getNome()));
            } else {
                posicionarEmbarcacoes(embarcacao);
                return;
            }
        } else {
            int c = p.getColuna() + embarcacao.getTamanho();
            if (c < qtColunas) {
                for (int i = 1; i < embarcacao.getTamanho(); i++) { // comeÃ§a com 1 pq a posiÃ§Ã£o zero Ã© colocada na
                                                                    // variÃ¡vel p
                    int posicao = posicoes.indexOf(new Posicao(linha + i, coluna));
                    if (posicao < 0) {
                        posicionarEmbarcacoes(embarcacao);
                        return;
                    }
                    Posicao pNew = posicoes.get(posicao);
                    if (!pNew.isInOcupada()) {
                        pNew.setInOcupada(true);
                    } else {
                        System.out.println(String.format("Posicao ocupada L%d C%d", pNew.getLinha(), pNew.getColuna()));
                        posicionarEmbarcacoes(embarcacao);
                        return;
                    }
                }
                embarcacao.setPosicaoInicial(p);
                embarcacao.setInHorizontal(false);
                p.setInOcupada(true);
                System.out.println(String.format("Posicao L%d-C%d, ocupada com peca do tipo %s", p.getLinha(),
                        p.getColuna(), embarcacao.getNome()));
            } else {
                posicionarEmbarcacoes(embarcacao);
                return;
            }
        }

    }

    public List<Embarcacao> getColEmbarcacao() {
        return colEmbarcacao;
    }

    public void setColEmbarcacao(List<Embarcacao> colEmbarcacao) {
        this.colEmbarcacao = colEmbarcacao;
    }

    public List<Posicao> getPosicoes() {
        return posicoes;
    }

    public void setPosicoes(List<Posicao> posicoes) {
        this.posicoes = posicoes;
    }

    public int getQtColunas() {
        return qtColunas;
    }

    public void setQtColunas(int qtColunas) {
        this.qtColunas = qtColunas;
    }

    public int getQtLinhas() {
        return qtLinhas;
    }

    public void setQtLinhas(int qtLinhas) {
        this.qtLinhas = qtLinhas;
    }

    public int getQtSubmarino() {
        return qtSubmarino;
    }

    public void setQtSubmarino(int qtSubmarino) {
        this.qtSubmarino = qtSubmarino;
    }

    public int getQtDestroyer() {
        return qtDestroyer;
    }

    public void setQtDestroyer(int qtDestroyer) {
        this.qtDestroyer = qtDestroyer;
    }

    public int getQtCruzador() {
        return qtCruzador;
    }

    public void setQtCruzador(int qtCruzador) {
        this.qtCruzador = qtCruzador;
    }

    public int getQtEncouracado() {
        return qtEncouracado;
    }

    public void setQtEncouracado(int qtEncouracado) {
        this.qtEncouracado = qtEncouracado;
    }

    public int getQtportaAvioes() {
        return qtPortaAvioes;
    }

    public void setQtportaAvioes(int qtPortaAvioes) {
        this.qtPortaAvioes = qtPortaAvioes;
    }

}